www.gusucode.com > VC++ TreeView树控件使用示例-源码程序 > VC++ TreeView树控件使用示例-源码程序/code/TreeViewDlg.cpp
// TreeViewDlg.cpp : implementation file // Download by http://www.NewXing.com #include "stdafx.h" #include "TreeView.h" #include "TreeViewDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CTreeViewDlg dialog //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //构造函数 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ CTreeViewDlg::CTreeViewDlg(CWnd* pParent /*=NULL*/) : CDialog(CTreeViewDlg::IDD, pParent) { //{{AFX_DATA_INIT(CTreeViewDlg) //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CTreeViewDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CTreeViewDlg) DDX_Control(pDX, IDC_TREE, m_tree); DDX_Control(pDX, IDC_LIST, m_list); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CTreeViewDlg, CDialog) //{{AFX_MSG_MAP(CTreeViewDlg) ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_NOTIFY(TVN_ITEMEXPANDED, IDC_TREE, OnItemexpandedTree) ON_NOTIFY(TVN_SELCHANGED, IDC_TREE, OnSelchangedTree) ON_NOTIFY(TVN_SELCHANGING, IDC_TREE, OnSelchangingTree) ON_NOTIFY(NM_CLICK, IDC_TREE, OnClickTree) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CTreeViewDlg message handlers //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //函数功能:初始化 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ BOOL CTreeViewDlg::OnInitDialog() { CDialog::OnInitDialog(); // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here m_ImageList.Create(32,32,ILC_COLOR32,10,30); m_list.SetImageList(&m_ImageList,LVSIL_NORMAL); DWORD dwStyle = GetWindowLong(m_tree.m_hWnd,GWL_STYLE); dwStyle |= TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT; SetWindowLong(m_tree.m_hWnd,GWL_STYLE,dwStyle); m_hRoot = m_tree.InsertItem("我的电脑"); GetLogicalDrives(m_hRoot); GetDriveDir(m_hRoot); m_tree.Expand(m_hRoot,TVE_EXPAND); return TRUE; // return TRUE unless you set the focus to a control } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CTreeViewDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } // The system calls this to obtain the cursor to display while the user drags // the minimized window. HCURSOR CTreeViewDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //函数功能:获取驱动器 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void CTreeViewDlg::GetLogicalDrives(HTREEITEM hParent) { size_t szAllDriveStrings = GetLogicalDriveStrings(0,NULL); char *pDriveStrings = new char[szAllDriveStrings + sizeof(_T(""))]; GetLogicalDriveStrings(szAllDriveStrings,pDriveStrings); size_t szDriveString = strlen(pDriveStrings); while(szDriveString > 0) { m_tree.InsertItem(pDriveStrings,hParent); pDriveStrings += szDriveString + 1; szDriveString = strlen(pDriveStrings); } } //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //函数功能:添加子项 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void CTreeViewDlg::GetDriveDir(HTREEITEM hParent) { HTREEITEM hChild = m_tree.GetChildItem(hParent); while(hChild) { CString strText = m_tree.GetItemText(hChild); if(strText.Right(1) != "\\") strText += _T("\\"); strText += "*.*"; CFileFind file; BOOL bContinue = file.FindFile(strText); while(bContinue) { bContinue = file.FindNextFile(); if(file.IsDirectory() && !file.IsDots()) m_tree.InsertItem(file.GetFileName(),hChild); } GetDriveDir(hChild); hChild = m_tree.GetNextItem(hChild,TVGN_NEXT); } } //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //函数功能:展开事件函数 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void CTreeViewDlg::OnItemexpandedTree(NMHDR* pNMHDR, LRESULT* pResult) { NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; // TODO: Add your control notification handler code here TVITEM item = pNMTreeView->itemNew; if(item.hItem == m_hRoot) return; HTREEITEM hChild = m_tree.GetChildItem(item.hItem); while(hChild) { AddSubDir(hChild); hChild = m_tree.GetNextItem(hChild,TVGN_NEXT); } *pResult = 0; } //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //函数功能:获取树项目全跟径 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ CString CTreeViewDlg::GetFullPath(HTREEITEM hCurrent) { CString strTemp; CString strReturn = ""; while(hCurrent != m_hRoot) { strTemp = m_tree.GetItemText(hCurrent); if(strTemp.Right(1) != "\\") strTemp += "\\"; strReturn = strTemp + strReturn; hCurrent = m_tree.GetParentItem(hCurrent); } return strReturn; } //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //添加子目录 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void CTreeViewDlg::AddSubDir(HTREEITEM hParent) { CString strPath = GetFullPath(hParent); if(strPath.Right(1) != "\\") strPath += "\\"; strPath += "*.*"; CFileFind file; BOOL bContinue = file.FindFile(strPath); while(bContinue) { bContinue = file.FindNextFile(); if(file.IsDirectory() && !file.IsDots()) m_tree.InsertItem(file.GetFileName(),hParent); } } //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ //函数功能:选中事件 //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ void CTreeViewDlg::OnSelchangedTree(NMHDR* pNMHDR, LRESULT* pResult) { m_list.DeleteAllItems(); NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR; TVITEM item = pNMTreeView->itemNew; if(item.hItem == m_hRoot) return; CString str = GetFullPath(item.hItem); if(str.Right(1) != "\\") str += "\\"; str += "*.*"; CFileFind file; BOOL bContinue = file.FindFile(str); while(bContinue) { bContinue = file.FindNextFile(); if(!file.IsDirectory() && !file.IsDots()) { SHFILEINFO info; CString temp = str; int index = temp.Find("*.*"); temp.Delete(index,3); SHGetFileInfo(temp + file.GetFileName(),0,&info,sizeof(&info),SHGFI_DISPLAYNAME | SHGFI_ICON); int i = m_ImageList.Add(info.hIcon); m_list.InsertItem(i,info.szDisplayName,i); } } *pResult = 0; } void CTreeViewDlg::OnSelchangingTree(NMHDR* pNMHDR, LRESULT* pResult) { *pResult = 0; } void CTreeViewDlg::OnClickTree(NMHDR* pNMHDR, LRESULT* pResult) { // TODO: Add your control notification handler code here *pResult = 0; }